# code:utf8

# section: import

# 更好的print输出
from yaspin import yaspin

# 时间
import time
import datetime

# 正则表达式
import re

# 模拟登陆：手机等移动设备
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Class

class Basic_Tools():

    def BeautifulTimeWait(self, wait_seconds):
        with yaspin(text="等待【" + str(wait_seconds) + "】秒") as sp:
            for time_cursor in list(range(0, wait_seconds)):
                current_number = time_cursor+1
                time.sleep(1)
                sp.write("--> 已等待【" + str(current_number) + "】秒")

            sp.green.ok("✔")

class Wechat():

    def __init__(self):

        # 初始化：基础工具对象
        self.TheTools = Basic_Tools()

        # 初始化：Appium参数
        self.desired_caps = {}

        # 设备的平台
        self.desired_caps['platformName'] = 'Android'
        # 设备的平台的版本
        self.desired_caps['platformVersion'] = '10'

        # 设备的唯一识别码
        # 查看：adb devices
        self.desired_caps['deviceName'] = '你的安卓手机的唯一识别码'

        # 会话
        # 避免错误：
        # 【selenium.common.exceptions.InvalidSessionIdException: Message: A session is either terminated or not started】
        self.desired_caps['appActivity'] = ''
        self.desired_caps['appWaitActivity'] = ''

        # 微信：
        # 包名
        self.desired_caps['appPackage'] = 'com.tencent.mm'
        # 动作
        self.desired_caps['appActivity'] = '.ui.LauncherUI'

        # 保留会话
        # 这个很重要 True表示不删除相关信息，不写每一次都需要重新登录
        self.desired_caps['noReset'] = True

        # 定义在【朋友圈】的时候滑动位置
        # Old
        # self.FLICK_START_X = 300
        # self.FLICK_START_Y = 300
        # self.FLICK_DISTANCE = 120

        # NEW
        self.start_x = 300
        self.start_y = 1300
        self.end_x = 300
        self.end_y = 300

    # 微信：启动 / 打开
    def WeChat_Launch(self,Keep_Session):

        if Keep_Session:
            self.desired_caps['noReset'] = True
        else:
            self.desired_caps['noReset'] = False

        # 1. 启动【appium】，默认端口【4723】
        # 开启了一个会话
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', self.desired_caps)

        # 设置等待
        self.wait = WebDriverWait(self.driver, 5)

        # 提示：微信启动成功
        print("======")
        yaspin().green.ok("✔ 【微信】启动成功")

    # 方法：基础
    # 按钮点击
    def appium_action_clickable(self, resource_id):

        # 变量
        # 当前时间
        str_current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        try:
            # 找到目标按钮
            ObjButton = self.wait.until(EC.element_to_be_clickable((By.ID, resource_id)))

            # 点击按钮
            ObjButton.click()

        except Exception as excp:
            # 遇到了错误
            print("<你期望的操作：执行失败 / " + str_current_time + ">")

    # 修改文本框内容
    def appium_action_text(self, resource_id, resource_class, text_value):

        # Display
        # print("Current resource_id = 【" + resource_id + "】")

        # 变量
        # 当前时间
        str_current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        try:
            # 找到目标文本框
            ObjText = self.wait.until(EC.presence_of_element_located(
                (By.XPATH, '//*[@resource-id="'+resource_id+'"]/' + resource_class + '')))

            # --- 测试
            # print(type(ObjText))

            # 聚焦文本框
            # ObjText.click()

            # 向文本框中传入数据
            ObjText.send_keys(text_value)

        except Exception as excp:
            # 遇到了错误
            print("<你期望的操作：执行失败 / " + str_current_time + ">")

    # 获取文本框内容
    def appium_action_get_text(self, resource_id):

        # 变量
        # 返回值
        data_result = ""

        # 当前时间
        str_current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

        # 找到目标按钮
        try:
            Obj = self.wait.until(EC.element_to_be_clickable((By.ID, resource_id)))
            data_result = Obj.text

        except Exception as excp:
            data_result = "<暂时没有数据：" + str_current_time + ">"

        # 阶段：返回
        return data_result

    # 方法：场景

    def login(self):
        # ————————————————
        # 模拟登陆行为
        # ————————————————

        # 解除保留会话
        # self.desired_caps['noReset'] = False

        # 打开微信
        self.WeChat_Launch(Keep_Session=False)

        # ————————————————
        # 阶段：
        # 等待时间
        print("======")
        # time.sleep(15)
        self.TheTools.BeautifulTimeWait(wait_seconds=11)

        # ————————————————
        # 阶段：
        # 登陆
        print("======")
        yaspin().green.ok("✔ 【微信】登陆阶段")

        # ————————————————
        # 画面：1
        # ————————————————
        print("--> 画面 / 1")

        screen_1_button_login_resource_id = "com.tencent.mm:id/ene"
        self.appium_action_clickable(resource_id=screen_1_button_login_resource_id)

        # ————————————————
        # 画面：2 / 如果需要，可以解开注释
        # ————————————————
        # 权限申请 / 我知道了
        # print("--> 画面 / 2")

        # screen_2_button_priv_resource_id = "com.tencent.mm:id/b49"
        # self.appium_action_clickable(resource_id=screen_2_button_priv_resource_id)

        # ————————————————
        # 画面：3 / 如果需要，可以解开注释
        # ————————————————
        # 权限申请 / 安卓系统权限许可
        # print("--> 画面 / 3")

        # screen_3_button_syspriv_resource_id = "com.lbe.security.miui:id/permission_allow_button_1"
        # self.appium_action_clickable(resource_id=screen_3_button_syspriv_resource_id)

        # screen_3_button_syspriv_resource_id = "com.lbe.security.miui:id/permission_allow_button_1"
        # self.appium_action_clickable(resource_id=screen_3_button_syspriv_resource_id)

        # ————————————————
        # 画面：4
        # ————————————————
        # 登陆画面 / 1
        print("--> 画面 / 4")

        screen_4_button_use_wechat_account_resource_id = "com.tencent.mm:id/d16"
        self.appium_action_clickable(resource_id=screen_4_button_use_wechat_account_resource_id)

        # ————————————————
        # 画面：5
        # ————————————————
        # 登陆画面 / 2
        print("--> 画面 / 5")

        # --> 用户名
        text_data_username = "你的微信用户名"

        screen_5_text_username_resource_id = "com.tencent.mm:id/d14"
        screen_5_text_username_resource_class = "android.widget.EditText"

        self.appium_action_text(resource_id=screen_5_text_username_resource_id,resource_class=screen_5_text_username_resource_class,text_value=text_data_username)

        # --> 密码
        text_data_password = "你的微信密码"

        screen_5_text_password_resource_id = "com.tencent.mm:id/d15"
        screen_5_text_password_resource_class = "android.widget.EditText"

        self.appium_action_text(resource_id=screen_5_text_password_resource_id,resource_class=screen_5_text_password_resource_class,text_value=text_data_password)

        # --> 点击登陆
        screen_5_button_login_resource_id = "com.tencent.mm:id/d17"
        self.appium_action_clickable(resource_id=screen_5_button_login_resource_id)

        # ————————————————
        # 画面：6
        # ————————————————
        # 通讯录权限
        print("--> 画面 / 6")

        screen_6_button_priv_resource_id = "com.tencent.mm:id/b49"
        self.appium_action_clickable(resource_id=screen_6_button_priv_resource_id)

        # 等待
        self.TheTools.BeautifulTimeWait(wait_seconds=100)

        # ————————————————
        # 画面：7
        # ————————————————
        # 微信可以设置字体大小
        # print("--> 画面 / 7")

        # screen_6_button_priv_resource_id = "com.tencent.mm:id/b48"
        # self.appium_action_clickable(resource_id=screen_6_button_priv_resource_id)

        # 最终反馈
        print("======")
        yaspin().green.ok("✔ 【微信】登陆成功")

    # 查找某个人的微信朋友圈
    def find_WeChat_Moment(self, WeChat_account_name):

        # 启用保留会话
        # self.desired_caps['noReset'] = True

        # 打开微信
        self.WeChat_Launch(Keep_Session=True)

        # 搜索某人的朋友圈
        print("======")
        yaspin().green.ok("✔ 【微信 / 朋友圈】查找 <" + WeChat_account_name + ">")

        # ————————————————
        # 画面：1
        # ————————————————
        # 点击搜索
        print("---> 画面 / 1")

        screen_1_button_search_resource_id = "com.tencent.mm:id/c8"
        self.appium_action_clickable(resource_id=screen_1_button_search_resource_id)

        # ————————————————
        # 画面：2
        # ————————————————
        # 录入要搜索的内容
        print("---> 画面 / 2")

        screen_2_input_search_resource_id = "com.tencent.mm:id/m7"

        # Way 1
        # screen_2_input_search_resource_class = "android.widget.EditText"
        # self.appium_action_text(resource_id=screen_2_input_search_resource_id,
        #                         resource_class=screen_2_input_search_resource_class,
        #                         text_value=WeChat_account_name)

        # Way 2
        search_input = self.wait.until(EC.presence_of_element_located((By.ID, screen_2_input_search_resource_id)))
        search_input.send_keys(WeChat_account_name)

        # ————————————————
        # 画面：3
        # ————————————————
        # 进入目标账户 / 1
        print("---> 画面 / 3")

        screen_3_button_search_result_resource_id = "com.tencent.mm:id/s7"
        self.appium_action_clickable(resource_id=screen_3_button_search_result_resource_id)

        # ————————————————
        # 画面：4
        # ————————————————
        # 进入目标账户 / 2
        print("---> 画面 / 4")

        screen_4_button_detail_resource_id = "com.tencent.mm:id/lo"
        self.appium_action_clickable(resource_id=screen_4_button_detail_resource_id)

        # ————————————————
        # 画面：5
        # ————————————————
        # 进入目标账户 / 3
        print("---> 画面 / 5")

        screen_5_button_detail_resource_id = "com.tencent.mm:id/ej_"
        self.appium_action_clickable(resource_id=screen_5_button_detail_resource_id)

        # ————————————————
        # 画面：6
        # ————————————————
        # 进入目标朋友圈
        print("---> 画面 / 6")

        screen_6_button_Moment_resource_id = "com.tencent.mm:id/dl4"
        self.appium_action_clickable(resource_id=screen_6_button_Moment_resource_id)

        # 最终反馈
        print("======")
        yaspin().green.ok("✔ 【微信 / 朋友圈】已进入 <" + WeChat_account_name + ">")

    # 爬取数据 / 单屏操作
    def get_WeChat_Moment_data_one_page(self, current_loop):

        # ---------------------
        # 每次页面数据处理阶段；
        # ---------------------
        print("爬取数据 / 单屏操作")

        # 定位ListView
        # 当无法通过resource_id找到对应资源的时候，报错为：
        # 【selenium.common.exceptions.TimeoutException: Message:】
        # 因此这一段，应该增加异常判断
        # Old
        # ObjListView = self.wait.until(EC.presence_of_all_elements_located((By.ID, 'com.tencent.mm:id/ezu')))

        # New.2020年2月26日
        # ObjListView = self.wait.until(EC.presence_of_element_located(
        #     (By.XPATH, '//*[@resource-id="com.tencent.mm:id/ezu"]//android.widget.ListView')))

        # 这是准确的
        ObjListView = self.driver.find_elements_by_xpath("//*[contains(@resource-id, 'com.tencent.mm:id/ezu')]/android.widget.LinearLayout")

        # 大小
        ObjListView_size = len(ObjListView)

        # 显示
        print("【ListView】当前单屏大小为【" + str(ObjListView_size) + "】")

        # 遍历集合
        current_cursor = 1
        for ObjRecord in ObjListView:

            # Intro
            print()
            print("=======================================")
            print("当前执行【" + str(current_cursor) + "】，总数【" + str(ObjListView_size) + "】")
            print("=======================================")

            # 获得：子对象的【resource-id / resourceID】
            ObjRecord_resource_id = ObjRecord.get_attribute("resourceId")

            ObjRecord_resource_id_finally = ""

            if ObjRecord_resource_id is None:
                # 说明是朋友圈的最开头的某人的说明
                ObjRecord_resource_id_finally = "Null"

                # 对象
                Moment_Top_Content = self.driver.find_elements_by_xpath(
                    "//*[contains(@resource-id, 'com.tencent.mm:id/ezu')]/android.widget.LinearLayout/android.widget.RelativeLayout")

                Moment_Top_Content_size = len(Moment_Top_Content)

                for Moment_detail in Moment_Top_Content:
                    # 定义
                    Moment_detail_resource_id = Moment_detail.get_attribute("resourceId")

                    # 姓名
                    Moment_detail_name = self.appium_action_get_text('com.tencent.mm:id/baj')
                    # 签名
                    Moment_detail_words = self.appium_action_get_text('com.tencent.mm:id/f0p')

                    # 显示
                    print("%%%%%%%%%%%%%%%%%%%%%%%%%%%")
                    print("朋友圈 / 头像部分 - resource-id 【" + Moment_detail_resource_id + "】")
                    print("昵称：【" + Moment_detail_name + "】")
                    print("签名：【" + Moment_detail_words + "】")
                    print("%%%%%%%%%%%%%%%%%%%%%%%%%%%")
                    print()

            else:

                # 这一部分就是非朋友圈头部的正文部分了
                # 这一部分有三种数据：
                # 第一个：项目是创建朋友圈记录
                # 每天日期分隔符的记录
                # 真正的记录

                # 从列表的前两位过滤

                if current_cursor in [1,2]:

                    # 处理
                    print("*** 抛弃：因为是当前列表的前两项 ***")

                    # 自增
                    current_cursor = current_cursor + 1

                    # 跳出当前循环
                    continue

                # if current_cursor == 2 and current_loop == 1:
                #
                #     print("这是【发布新的朋友圈】")
                #     # 自增
                #     current_cursor = current_cursor + 1
                #
                #     continue

                # 如果是列表的最后一项，也抛弃
                # 因为界面可能看不到，因此在爬取的时候会遇到问题
                # 要保证爬取的数据完整，没有缺少，则剩下来的需要靠【滑动】动作的幅度来控制了

                if current_cursor == ObjListView_size:
                    # 处理
                    print("*** 抛弃：因为是当前列表的最后一项 ***")

                    # 自增
                    current_cursor = current_cursor + 1

                    # 跳出当前循环
                    continue

                # 从列表的第三位开始处理

                # 当前循环总对象的resource-id
                ObjRecord_resource_id_finally = ObjRecord_resource_id

                # 对象定义 / 1

                # Old
                # ObjRecord_detail = ObjRecord.find_element_by_id(ObjRecord_resource_id_finally).\
                #     find_elements_by_xpath("//android.widget.LinearLayout/android.widget.LinearLayout")[2].\
                #     find_element_by_xpath("//*[@index=\"1\" and @class='android.widget.LinearLayout']")

                # Level 1
                # 根据前面找到的每个ListView下一级的对象得到的当前循环的起点对象位置
                ObjRecord_detail = ObjRecord.find_element_by_id(ObjRecord_resource_id_finally). \
                    find_elements_by_xpath("//android.widget.LinearLayout")

                # 获取当前列表的总数
                # 当前列表的最后一个对象就是我们想要找的对象
                ObjRecord_detail_size = len(ObjRecord_detail)

                # 最后一个列表项的 索引值
                # 索引从0开始，因此需要减去1
                ObjRecord_detail_target_index = ObjRecord_detail_size-1

                # ObjRecord_detail_resource_id = ObjRecord_detail.get_attribute("resourceId")
                # ObjRecord_detail_id = ObjRecord_detail.id

                # Level 2
                # Old
                # ObjRecord_detail_sub = ObjRecord_detail[6]

                # ObjRecord_detail_sub_resource_id = ObjRecord_detail_sub.get_attribute("resourceId")
                # ObjRecord_detail_sub_size = len(ObjRecord_detail_sub)
                # ObjRecord_detail_sub_id = ObjRecord_detail_sub.id

                # New
                ObjRecord_detail_Level_2 = ObjRecord_detail[ObjRecord_detail_target_index]

                ObjRecord_detail_Level_2_resource_id = ObjRecord_detail_Level_2.get_attribute("resourceId")

                ObjRecord_detail_Level_2_resource_id_finally = ""

                if ObjRecord_detail_Level_2_resource_id is None:
                    ObjRecord_detail_Level_2_resource_id_finally = "Null"
                else:
                    ObjRecord_detail_Level_2_resource_id_finally = ObjRecord_detail_Level_2_resource_id

                ObjRecord_detail_Level_2_id = ObjRecord_detail_Level_2.id

                # 判断是否是可以点击的
                ObjRecord_detail_Level_2_clickable = ObjRecord_detail_Level_2.get_attribute("clickable")

                #  显示
                print(ObjRecord_detail_Level_2_resource_id)
                print(ObjRecord_detail_Level_2_id)
                print("isClickable？【" + str(ObjRecord_detail_Level_2_clickable) + "】")
                # print(ObjRecord_detail_size)

                # print("当前列表大小【" + str(ObjRecord_detail_size) + "】")

                # 测试 / 验证 / 排查
                # 开始循环
                # current_cursor_sub = 1
                # for ObjRecord_detail_item in ObjRecord_detail:
                #
                #     # 变量
                #     item_resource_id = ObjRecord_detail_item.get_attribute("resourceId")
                #     item_resource_id_finally = ""
                #
                #     if item_resource_id is None:
                #         item_resource_id_finally = "Null"
                #     else:
                #         item_resource_id_finally = item_resource_id
                #
                #     item_id = ObjRecord_detail_item.id
                #
                #     # 显示
                #     print("Current --> " + str(current_cursor_sub))
                #     print("ID: " + item_id)
                #     print("Resource ID: " + item_resource_id_finally)
                #
                #     # 自增
                #     current_cursor_sub = current_cursor_sub + 1

                # ——————————————
                # 进入单条记录
                # ——————————————
                yaspin().green.ok("✔ 【微信 / 朋友圈】正在进入 <条目详情单页>")

                # 微信里面的记录有两种
                # 纯粹文字的
                # 包含视频或者图片的
                # 这两种类型的记录，在自动抓取的时候的行为与步骤是不一样的
                # 包含视频或图片的，会比，纯粹文字的，在进入与退出两个阶段，分别多出一步操作

                # --> 第一次点击：进入详情页 / 1
                # 第一次点击的条目入口会根据内容不同，而导致resource-id不同
                # 因此，不能写死，也不能直接从上面的【ObjRecord_detail】触发点击事件
                # Old
                # ObjRecord_detail.click()

                # 直接用上面最终找到的具体的记录的入口对象

                # 增加一个判断，判断是否是可以点击的，如果不是，则跳出当前循环
                # 这一行一般是不同的朋友圈的记录的分隔的线，可能这个值会变，但是这里确实是有一条分割线存在的
                # 这条分割线，应该过滤掉
                if ObjRecord_detail_Level_2_resource_id_finally == "com.tencent.mm:id/f22":

                    # 每次做跳过的时候，都应该先自增循环游标，否则程序的遍历逻辑会被打乱
                    # 自增
                    current_cursor = current_cursor + 1

                    continue
                else:
                    ObjRecord_detail_Level_2.click()

                # New
                # one_record_first_resource_id = "com.tencent.mm:id/a_y"
                # one_record_first_resource_id = "com.tencent.mm:id/f24"

                # 这里的起始点击的resource_id，来源于上面的步骤的精准爬取
                # 因为微信里面的数据是动态的，不同的数据标签的行为是不一样的
                # one_record_first_resource_id = ObjRecord_detail_Level_2_resource_id
                # self.appium_action_clickable(resource_id=one_record_first_resource_id)

                # --> 第二次点击：进入详情页 / 2 / 已到达详情页最终位置 / 这是如果不同，会多出来的步骤
                # 如果朋友圈的某一条记录包含图片或者视频，则需要增加这一步
                # if ObjRecord_detail_Level_2_resource_id == "com.tencent.mm:id/f24":
                if re.match("com.tencent.mm:id/f(.*)", str(ObjRecord_detail_Level_2_resource_id_finally)):

                    one_record_detail_resource_id = "com.tencent.mm:id/f0c"
                    self.appium_action_clickable(resource_id=one_record_detail_resource_id)

                yaspin().green.ok("✔ 【微信 / 朋友圈】已进入 <条目详情单页>")

                # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                # 处理对详情页数据的爬取（开始）
                # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                # 单条记录的详情页 / 分析
                self.analyze_WeChat_Moment_Record_DetailPage()

                # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                # 处理对详情页数据的爬取（结束）
                # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

                # ——————————————
                # 返回某个人的朋友圈的总列表
                # ——————————————
                yaspin().green.ok("✔ 【微信 / 朋友圈】返回 <总列表>")

                # 返回最初的朋友圈列表界面 / 1
                one_record_back_resource_id = "com.tencent.mm:id/m1"
                self.appium_action_clickable(resource_id=one_record_back_resource_id)

                # 返回最初的朋友圈列表界面 / 2
                # 如果朋友圈的某一条记录包含图片或者视频，则需要增加这一步
                # if ObjRecord_detail_Level_2_resource_id == "com.tencent.mm:id/f24":
                if re.match("com.tencent.mm:id/f(.*)", str(ObjRecord_detail_Level_2_resource_id_finally)):

                    one_record_back_resource_id = "com.tencent.mm:id/m1"
                    self.appium_action_clickable(resource_id=one_record_back_resource_id)

                yaspin().green.ok("✔ 【微信 / 朋友圈】已返回 <总列表>")

            # 显示
            print("### Finally ###")
            print("ObjRecord / resource-id【" + ObjRecord_resource_id_finally + "】")

            # 自增
            current_cursor = current_cursor + 1

    # 朋友圈 记录 最终的详情页的分析
    def analyze_WeChat_Moment_Record_DetailPage(self):

        # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        # 处理对详情页数据的爬取（开始）
        # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        # 单条记录的详情页

        # 【变量的命名】

        # 部分：作者

        # -- 头像 com.tencent.mm:id/eyy

        # -- 昵称 com.tencent.mm:id/baj
        author_nickname = self.appium_action_get_text(resource_id="com.tencent.mm:id/baj")

        # 部分：记录内容本身

        # -- 文字 com.tencent.mm:id/mk
        # 有可能没有
        record_content = self.appium_action_get_text(resource_id="com.tencent.mm:id/mk")

        # -- 图片 / 视频 com.tencent.mm:id/f0i
        # 有可能没有

        # -- 分享内容
        # 有可能没有

        # -- 记录发布的时间 com.tencent.mm:id/eza
        record_time_publish = self.appium_action_get_text(resource_id="com.tencent.mm:id/eza")

        # -- 操作 com.tencent.mm:id/eyz

        # @@ --> 点赞

        # @@ --> 评论
        # 有可能没有

        # 部分：点赞 需要循环
        # 有可能没有

        # 部分：评论 com.tencent.mm:id/ezi
        # 多个评论的这些resource-id是一样的，需要多个循环直到最后采集结束

        # -- 评论人 头像 com.tencent.mm:id/ezl
        # -- 评论人 昵称 com.tencent.mm:id/ezn
        # -- 评论人 文字 com.tencent.mm:id/ezo
        # -- 评论发布的时间 com.tencent.mm:id/ezm

        # 【输出】
        # 作者
        print()
        print("************")
        print("部分：发布者信息")
        print("************")
        print("昵称：【" + author_nickname + "】")

        # 记录内容
        # print()
        print("************")
        print("部分：朋友圈记录")
        print("************")
        print("文字内容：【" + record_content + "】")
        print("发布时间：【" + record_time_publish + "】")

        # 点赞
        # print()
        # print("************")
        # print("部分：点赞")
        # print("************")

        # 评论
        # print()
        # print("************")
        # print("部分：评论")
        # print("************")

    # 爬取数据 / 整体操作（自动滑动）
    def get_WeChat_Moment_data(self):

        # 变量

        # 计数器
        current_loop_while_Moment_data = 1

        while True:
            # ---------------------
            # 每次页面数据处理阶段；
            # ---------------------

            # Intro
            print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
            print("朋友圈 / 整体爬取：当前轮次【" + str(current_loop_while_Moment_data) + "】")
            print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
            print()

            # 正式执行
            self.get_WeChat_Moment_data_one_page(current_loop=current_loop_while_Moment_data)

            # 自增
            current_loop_while_Moment_data = current_loop_while_Moment_data + 1

            # ---------------------
            # 上翻阶段；
            # ---------------------

            # 滑动

            # 显示
            print("准备滑动，...")

            # 800 - 300, 朋友圈相当于，每次上翻三条记录，500
            # self.driver.swipe(300, 800, 300, 300, 2000)

            # 每次上翻8条记录
            # self.driver.swipe(300, 1600, 300, 300)
            self.driver.swipe(self.start_x, self.start_y, self.end_x, self.end_y)

            # 旧的方法
            # self.driver.swipe(self.FLICK_START_X, self.FLICK_START_Y + self.FLICK_DISTANCE,
            #                   self.FLICK_START_X, self.FLICK_START_Y)

            # 等待
            # self.TheTools.BeautifulTimeWait(wait_seconds=1)

# section: main
if __name__ == "__main__":
    # Intro
    # print("Hello world")

    # 基础函数
    # TheTools = Basic_Tools()
    # TheTools.BeautifulTimeWait(wait_seconds=4)

    # 微信
    ObjWeChat = Wechat()

    # 微信：登陆
    # ObjWeChat.login()

    # 微信：进入【某人】的朋友圈
    ObjWeChat.find_WeChat_Moment(WeChat_account_name="你希望爬取的微信好友的微信名")

    # 微信：爬取【朋友圈】数据

    # 进入单条
    # / 已废弃
    # ObjWeChat.enter_WeChat_Moment_One_Record_detail(one_record_resource_id="com.tencent.mm:id/kr")

    # 单页
    # / 测试
    # ObjWeChat.get_WeChat_Moment_data_one_page(current_loop=1)

    # 整体
    ObjWeChat.get_WeChat_Moment_data()

# section: finished